import xlwt
import random

# 创建工作薄对象
wb = xlwt.Workbook()
# 创建工作表对象
sheet = wb.add_sheet("python-2106班级")
# 定义学生姓名
students_name = ["关羽", "张飞", "刘备", "吕布", "马超"]
# 通过列表生成式生成成绩表  语文 数学  英语   二维列表
scores = [[random.randrange(50, 101) for i in range(3)] for j in range(5)]

# 创建表头数据
titles = ("姓名", "语文", "数学", "英语")

# 设置表头数据的样式 颜色设置为红色
header_style = xlwt.XFStyle()
pattern = xlwt.Pattern()
pattern.pattern = xlwt.Pattern.SOLID_PATTERN
# 0 - 黑色、1 - 白色、2 - 红色、3 - 绿色、4 - 蓝色、5 - 黄色、6 - 粉色、7 - 青色
pattern.pattern_fore_colour = 2
header_style.pattern = pattern

# 为样式创建字体
font = xlwt.Font()
font.name = '华文楷体'
# 字体大小（20是基准单位，18表示18px）
font.height = 20 * 18
# 是否使用粗体
font.bold = True
# 是否使用斜体
font.italic = True
# 字体颜色
font.colour_index = 1
# 设定样式
header_style.font = font

# 设置对齐方式
align = xlwt.Alignment()
# 垂直方向的对齐方式
align.vert = xlwt.Alignment.VERT_CENTER
# 水平方向的对齐方式
align.horz = xlwt.Alignment.HORZ_CENTER
header_style.alignment = align

# 设置边框
borders = xlwt.Borders()
props = (
    ('top', 'top_colour'), ('right', 'right_colour'),
    ('bottom', 'bottom_colour'), ('left', 'left_colour')
)
# 通过循环对四个方向的边框样式及颜色进行设定
for position, color in props:
    # 使用setattr内置函数动态给对象指定的属性赋值
    setattr(borders, position, xlwt.Borders.DASHED)
    setattr(borders, color, 5)
header_style.borders = borders
# 设置行高为40px
sheet.row(0).set_style(xlwt.easyxf(f'font:height {20 * 40}'))
# 设置表头数据的样式

for index, title in enumerate(titles):
    # 设置列宽为200px
    sheet.col(index).width = 20 * 200
    # 第一个参数表示行  第二个参数表示列  第三个参数表示内容  第四个参数表示样式
    sheet.write(0, index, title, header_style)
# 将学生的姓名和成绩写入到工作表中
for row in range(len(scores)):
    # print(row)
    # print(students_name[row])
    sheet.write(row + 1, 0, students_name[row])  # 从第二行开始写第一列的数据 学生的姓名
    for col in range(len(scores[row])):
        sheet.write(row + 1, col + 1, scores[row][col])  # 从第二行第二列开始填写每个学生的成绩
# 保存数据到工作簿
wb.save("考试成绩-添加样式.xls")
